<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
    <title>ShellCheck: SC2264 – This function unconditionally re-invokes itself. Missing `command`?</title>
    <link rel="stylesheet" href="css/bootstrap.min.css" />
  </head>
  <body style="margin-left: auto; margin-right: auto; max-width: 800px">
    <h1>SC2264 – ShellCheck Wiki</h1>
    <a href="https://github.com/koalaman/shellcheck/wiki/SC2264">See this page on GitHub</a>
    <p style="display: none"><a href="index.html">Sitemap</a></p>
    <hr />
    <h2
id="this-function-unconditionally-re-invokes-itself-missing-command">This
function unconditionally re-invokes itself. Missing
<code>command</code>?</h2>
<h3 id="problematic-code">Problematic code:</h3>
<div class="sourceCode" id="cb1"><pre class="sourceCode sh"><code class="sourceCode bash"><span id="cb1-1"><a href="SC2264.html#cb1-1" aria-hidden="true" tabindex="-1"></a><span class="fu">ls()</span> <span class="kw">{</span></span>
<span id="cb1-2"><a href="SC2264.html#cb1-2" aria-hidden="true" tabindex="-1"></a>  <span class="fu">ls</span> <span class="at">--color</span><span class="op">=</span>always <span class="st">&quot;</span><span class="va">$@</span><span class="st">&quot;</span></span>
<span id="cb1-3"><a href="SC2264.html#cb1-3" aria-hidden="true" tabindex="-1"></a><span class="kw">}</span></span>
<span id="cb1-4"><a href="SC2264.html#cb1-4" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb1-5"><a href="SC2264.html#cb1-5" aria-hidden="true" tabindex="-1"></a><span class="fu">cd()</span> <span class="kw">{</span></span>
<span id="cb1-6"><a href="SC2264.html#cb1-6" aria-hidden="true" tabindex="-1"></a>  <span class="bu">cd</span> <span class="st">&quot;</span><span class="va">$@</span><span class="st">&quot;</span> <span class="kw">&amp;&amp;</span> <span class="fu">ls</span></span>
<span id="cb1-7"><a href="SC2264.html#cb1-7" aria-hidden="true" tabindex="-1"></a><span class="kw">}</span></span></code></pre></div>
<h3 id="correct-code">Correct code:</h3>
<p>Note that <code>command</code> is the literal name of a shell
builtin. You should not replace it:</p>
<div class="sourceCode" id="cb2"><pre class="sourceCode sh"><code class="sourceCode bash"><span id="cb2-1"><a href="SC2264.html#cb2-1" aria-hidden="true" tabindex="-1"></a><span class="fu">ls()</span> <span class="kw">{</span></span>
<span id="cb2-2"><a href="SC2264.html#cb2-2" aria-hidden="true" tabindex="-1"></a>  <span class="bu">command</span> ls <span class="at">--color</span><span class="op">=</span>always <span class="st">&quot;</span><span class="va">$@</span><span class="st">&quot;</span></span>
<span id="cb2-3"><a href="SC2264.html#cb2-3" aria-hidden="true" tabindex="-1"></a><span class="kw">}</span></span>
<span id="cb2-4"><a href="SC2264.html#cb2-4" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb2-5"><a href="SC2264.html#cb2-5" aria-hidden="true" tabindex="-1"></a><span class="fu">cd()</span> <span class="kw">{</span></span>
<span id="cb2-6"><a href="SC2264.html#cb2-6" aria-hidden="true" tabindex="-1"></a>  <span class="bu">command</span> cd <span class="st">&quot;</span><span class="va">$@</span><span class="st">&quot;</span> <span class="kw">&amp;&amp;</span> <span class="fu">ls</span></span>
<span id="cb2-7"><a href="SC2264.html#cb2-7" aria-hidden="true" tabindex="-1"></a><span class="kw">}</span></span></code></pre></div>
<h3 id="rationale">Rationale:</h3>
<p>ShellCheck found a function that immediately and unconditionally
re-invokes itself, causing infinite recursion.</p>
<p>This generally happens when writing a wrapper function with the same
name as an existing command, but forgetting to make sure it invokes the
existing command and not itself. This is what happened in both of the
problematic examples.</p>
<p>To invoke a command when a function by the same name is defined, i.e.
to suppress function lookup during execution, use the command
confusingly named <code>command</code>. For example, to run the system's
<code>ls</code> instead of the shell function <code>ls</code>, use
<code>command ls</code>.</p>
<h3 id="exceptions">Exceptions:</h3>
<p>ShellCheck does not intend to warn about infinite recursion or fork
bombs in general. This warning is purely meant for unintentional bugs in
well meaning wrapper functions.</p>
<p>If ShellCheck is triggering on an intentionally malicious fork bomb,
either <a href="ignore.html">ignore</a> the issue, or simply add a leading
command or condition:</p>
<pre><code>:() { true &amp;&amp; :|: &amp; }</code></pre>
<h3 id="related-resources">Related resources:</h3>
<ul>
<li>Help by adding links to BashFAQ, StackOverflow, man pages, POSIX,
etc!</li>
</ul>
    <hr />
    <p style='font-size: 80%'><a href="../index.html">ShellCheck</a> is a static analysis tool for shell scripts. This page is part of its documentation.</p>
  </body>
</html>


